#!/bin/bash
# =====================
# 系统更新维护工具
# =====================
# 基本配置
SCRIPT_NAME="系统更新维护工具"
AUTHOR="seeker_ok"
ICON_PATH="/usr/share/icons/hicolor/48x48/apps/zsjy-update.png"
USER_HOME="${HOME}"  
PACKAGE_NAME="zsjy-update"
# 设置窗口标题
echo -ne "\e]2;${SCRIPT_NAME} By:${AUTHOR}\a"
# 颜色定义 
RED='\033[0;31m' 
GREEN='\033[0;32m' 
YELLOW='\033[0;33m'
BLUE='\033[0;34m' 
NC='\033[0m'  # 重置颜色
# =====================
# 功能函数
# =====================
# 错误处理函数 - 防止闪退并提示用户
handle_error() {
    local message="$1"
    echo -e "\n${RED}【错误】${message}${NC}"
    notify "操作失败" "${message}" "error" "$ICON_PATH"
    read -p "按Enter键继续或关闭窗口..."  # 防止闪退，等待用户确认
}
# 确认继续函数
confirm_continue() {
    read -p "是否继续执行后续操作? (y/n): " -n 1 -r
    echo  # 换行
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        echo -e "\n${YELLOW}用户选择终止操作，脚本将退出${NC}"
        exit 1
    fi
}
# 桌面通知与终端提示函数
notify() { 
    local title="$1" message="$2" level="$3" icon="${4:-}"
    case "$level" in
        "success") color="$GREEN"; urgency="normal" ;;
        "warning") color="$YELLOW"; urgency="normal" ;;
        "error")   color="$RED"; urgency="critical" ;;
        *)         color="$NC"; urgency="normal" ;;
    esac
    echo -e "\n${color}【$title】${message}${NC}"
    # 发送桌面通知
    if command -v notify-send &> /dev/null; then
        if [[ -n "$icon" && -f "$icon" ]]; then
            notify-send -u "$urgency" -i "$icon" "$title" "$message" 2>/dev/null || true
        else
            notify-send -u "$urgency" "$title" "$message" 2>/dev/null || true
        fi
    fi
}
# ====================== 版本检查 ======================
GITEE_REPO="https://gitee.com/seeker_ok/${PACKAGE_NAME}"
LOCAL_VERSION=$(dpkg-query -W --showformat='${Version}' ${PACKAGE_NAME} 2>/dev/null)

# 获取远程版本号，设置3秒超时
REMOTE_CONTROL=$(curl -sL --connect-timeout 3 --max-time 3 "${GITEE_REPO}/raw/master/DEBIAN/control")

# 检查curl是否成功获取内容
if [ -z "$REMOTE_CONTROL" ]; then
  echo -e "${blue}无法在3秒内连接到远程服务器，跳过版本检查${nc}"
else
  remote_version=$(echo "$REMOTE_CONTROL" | grep 'Version:' | awk '{print $2}')
  
  # 版本比较函数
  version_compare() {
    if [ "$1" = "$2" ]; then
      return 0
    fi
    local IFS=.
    local i ver1=($1) ver2=($2)
    for ((i=${#ver1[@]}; i<${#ver2[@]}; i++)); do
      ver1[i]=0
    done
    for ((i=0; i<${#ver1[@]}; i++)); do
      if [[ -z ${ver2[i]} ]]; then
        ver2[i]=0
      fi
      if ((10#${ver1[i]} > 10#${ver2[i]})); then
        return 1
      fi
      if ((10#${ver1[i]} < 10#${ver2[i]})); then
        return 2
      fi
    done
    return 0
  }

  if version_compare "$LOCAL_VERSION" "$remote_version"; then
    : # 本地版本与远程版本相同，不执行任何操作
  elif [ $? -eq 1 ]; then
    echo -e "${red}本地版本 ${LOCAL_VERSION} 比远程版本 ${remote_version} 新${nc}"
  else
    echo -e "${green}发现${PACKAGE_NAME}有新版本 ${remote_version}，是否更新？[Yy/N]${nc}"
    read -p " " choice
    if [[ "$choice" = "y" || "$choice" = "Y" ]]; then
      deb_url="${GITEE_REPO}/raw/master/${PACKAGE_NAME}_${remote_version}_all.deb"
      x-terminal-emulator -e "bash -c \"
        export DISPLAY='$DISPLAY' XAUTHORITY='$XAUTHORITY';  # 传递环境变量
        echo -e '${green}正在下载并安装新版本,请稍等...${nc}';
        wget -q ${deb_url} -O /tmp/${PACKAGE_NAME}.deb && 
        sudo apt install -y /tmp/${PACKAGE_NAME}.deb && 
        rm -rf /tmp/${PACKAGE_NAME}.deb;
        echo -e '${green}软件已更新至 ${remote_version}，请关闭窗口重新运行${nc}';
        read -p $'${blue} 按任意键关闭此窗口...${nc}' \""
      exit 1
    fi
  fi
fi
#=====【检测软件是否有新的版本结束】==========
# =====================
# 主程序
# =====================
clear
echo -e "${BLUE}================================================${NC}"
echo -e "${BLUE}          ${SCRIPT_NAME}          ${NC}"
echo -e "${BLUE}================================================${NC}"
echo -e "欢迎使用系统更新维护工具，此过程可能需要较长时间。"
echo -e "执行过程中会显示详细信息，错误时将暂停等待确认。"
echo -e "作者: ${AUTHOR}\n"
# === 新增的sudo权限验证部分 ===
echo -e "${BLUE}▶ 验证sudo权限...${NC}"
if sudo -v; then
    echo -e "\n${GREEN}【成功】sudo权限验证通过，继续执行后续操作${NC}"
else
    echo -e "\n${RED}【错误】sudo权限验证失败！原因可能是：${NC}" 
    echo -e "${YELLOW}1. 当前用户未配置sudo权限"
    echo -e "2. 密码输入错误"
    exit 1
fi
# 更新包列表
echo -e "\n${BLUE}▶ 正在更新包列表...${NC}"
if sudo apt update; then
    echo -e "${GREEN}【成功】更新包列表已完成${NC}"
else
    handle_error "更新包列表过程中发生错误"
    confirm_continue
fi
# 执行系统升级
echo -e "\n${BLUE}▶ 正在执行系统升级...${NC}"
if sudo apt full-upgrade -y; then
    echo -e "${GREEN}【成功】执行系统升级已完成${NC}"
else
    handle_error "执行系统升级过程中发生错误"
    confirm_continue
fi
# 修复依赖问题
echo -e "\n${BLUE}▶ 正在修复依赖关系...${NC}"
if sudo apt install -f -y; then
    echo -e "${GREEN}【成功】修复依赖关系已完成${NC}"
else
    handle_error "修复依赖关系过程中发生错误"
    confirm_continue
fi
# 清理系统
echo -e "\n${BLUE}▶ 正在清理系统缓存...${NC}"
if sudo apt autoclean -y && sudo apt clean -y; then
    echo -e "${GREEN}【成功】清理系统缓存已完成${NC}"
else
    handle_error "清理系统缓存过程中发生错误"
    confirm_continue
fi
# 优化缓存文件搜索
echo -e "\n${BLUE}▶ 正在删除核心缓存文件...${NC}"
if sudo find "${USER_HOME}/.cache" -maxdepth 5 -name "core*" -print0 2>/dev/null | xargs -0 -n 100 rm -rfv; then
    echo -e "${GREEN}【成功】删除核心缓存文件已完成${NC}"
else
    handle_error "删除核心缓存文件过程中发生错误"
    confirm_continue
fi
# 完成提示
echo -e "\n${GREEN}===== 系统更新和维护流程已结束 =====${NC}\n"
echo -e "注意：如果过程中出现错误提示，建议根据提示手动修复"
# 发送完成通知
notify "系统维护完成" "所有操作已执行完毕，感谢您的使用！By：${AUTHOR}" "success" "$ICON_PATH"
read -p "按Enter键退出..."